package com.cy.store.controller;

import com.cy.store.controller.ex.*;
import com.cy.store.service.ex.*;
import com.cy.store.util.JsonResult;
import org.apache.ibatis.annotations.Update;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpSession;
import java.awt.*;
import java.io.File;
import java.nio.file.attribute.UserPrincipalNotFoundException;


/**
 * 控制层类的基类
 */
public class BaseController {
    /**
     * 操作成功的状态码
     */
    public static final int OK = 200;



    /**
     * 请求处理的方法，这个方法的返回值就是需要传递给前端的数据
     * 自动将异常对象传递给此方法的蚕食列表上
     * 当项目中产生了异常，会被统一拦截到此方法中，这个方法此时就是一个请求处理的方法，方法值直接返回给前端
     * @param
     * @return
     */
    //@ExceptionHandler用于统一处理抛出的异常
    @ExceptionHandler({ServiceException.class,FileUploadException.class})

    public JsonResult<Void> handleException(Throwable e) {
        JsonResult<Void> result = new JsonResult<>(e);
        if (e instanceof UsernameDuplicateException) {
            result.setState(4000);
            result.setMessage("用户名已经被占用");
        } else if (e instanceof UserNotFoundException) {
            result.setState(4001);
            result.setMessage("用户数据不存在的异常");
        } else if (e instanceof PasswordNotMatchException) {
            result.setState(4002);
            result.setMessage("用户的密码错误的异常");
        }else if (e instanceof AddressCountLimitException) {
            result.setState(4003);
            result.setMessage("用户的收货地址超出上限的异常");
        }else if (e instanceof AddressNotFoundException) {
            result.setState(4004);
            result.setMessage("数据没有找到");
        }else if (e instanceof AccessDeniedException) {
            result.setState(4005);
            result.setMessage("收货地址非法访问");
        }else if (e instanceof ProductNotFoundException) {
            result.setState(4006);
            result.setMessage("商品未被发现");
        }else if (e instanceof CartNotFoundException) {
            result.setState(4007);
        }else if (e instanceof ProductIsEmptyException) {
            result.setState(4008);
            result.setMessage("上传的商品数据为空");
        }else if (e instanceof InsertException) {
            result.setState(5000);
            result.setMessage("注册时，产生未知的异常");
        }else if (e instanceof UpdateException) {
            result.setState(5001);
            result.setMessage("更新时产生未知的异常");
        }else if (e instanceof DeleteException) {
            result.setState(5002);
            result.setMessage("更新时删除时产生未知的异常");
        }else if (e instanceof FileEmptyException) {
            result.setState(6000);
        } else if (e instanceof FileSizeException) {
            result.setState(6001);
        } else if (e instanceof FileTypeException) {
            result.setState(6002);
        } else if (e instanceof FileStateException) {
            result.setState(6003);
        } else if (e instanceof FileUploadIOException) {
            result.setState(6004);
        }
        return result;
    }

    /**
     * 获取session对象中的uid
     * @param session session对象
     * @return 当前登录的用户的uid
     */
    protected final Integer getuidFromSession(HttpSession session){
        return Integer.valueOf(session.getAttribute("uid").toString());
    }

    /**
     * 获取当前登录用户的username
     * @param session
     * @return 当前登录的用户名称
     */
    protected final String getUsernameFromSession(HttpSession session){
        return session.getAttribute("username").toString();
    }

    /**
     * 文件或文件夹的删除, 注意只能删除为空的文件夹，非空需要遍历删除所有
     * @param filepath 文件路径
     * @return
     */
    public static void delete(String filepath){
        File file = new File("C:/Users/14934/Desktop/舒镇洋-毕设/校园二手交易平台（mine)/static"+filepath);
        if (file == null){
            throw new FileEmptyException("文件夹为空");
        }
        findDeleteFile(file);
    }

    //创建一个方法，来查看文件夹是否为空
    public static void findDeleteFile(File file){
        //获取该文件下所有子文件和子文件夹
        File[] files=file.listFiles();

        //循环遍历数组中的所有子文件和文件夹
        if (files!=null){
            //判断是否是文件，如果是，就删除
            for (File file1 : files) {
                if (file1.isFile()) {
                    file1.delete();
                }
                //在循环中，判断遍历出的是否是文件夹
                if (file1.isDirectory()){
                    // 如果是文件夹,就递归删除里面的文件
                    findDeleteFile(file1);
                    // 删除该文件夹里所有文件后,当前文件夹就为空了,那么就可以删除该文件夹了
                    file1.delete();
                }
            }
        }
        //删除完里面的文件夹后，当前文件夹也删除
        file.delete();
    }



}
